home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / v10n03.arc / CLRCUBE.C next >
C/C++ Source or Header  |  1991-01-17  |  8KB  |  241 lines

  1. /*----------------------------------------
  2.    CLRCUBE.C -- Windows Color Cube
  3.                 (c) Charles Petzold, 1990
  4.   ----------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include "clrcube.h"
  8.  
  9. long FAR PASCAL WndProc (HWND, WORD, WORD, LONG) ;
  10.  
  11. char szAppName [] = "ClrCube" ;
  12.  
  13. int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
  14.                     LPSTR lpszCmdLine, int nCmdShow)
  15.      {
  16.      HWND     hwnd ;
  17.      MSG      msg ;
  18.      WNDCLASS wndclass ;
  19.  
  20.      if (!hPrevInstance) 
  21.           {
  22.           wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  23.           wndclass.lpfnWndProc   = WndProc ;
  24.           wndclass.cbClsExtra    = 0 ;
  25.           wndclass.cbWndExtra    = 0 ;
  26.           wndclass.hInstance     = hInstance ;
  27.           wndclass.hIcon         = NULL ;
  28.           wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  29.           wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
  30.           wndclass.lpszMenuName  = szAppName ;
  31.           wndclass.lpszClassName = szAppName ;
  32.  
  33.           RegisterClass (&wndclass) ;
  34.           }
  35.  
  36.      hwnd = CreateWindow (szAppName, "Color Cube",
  37.                           WS_OVERLAPPEDWINDOW,
  38.                           CW_USEDEFAULT, CW_USEDEFAULT,
  39.                           CW_USEDEFAULT, CW_USEDEFAULT,
  40.                           NULL, NULL, hInstance, NULL) ;
  41.  
  42.      ShowWindow (hwnd, nCmdShow) ;
  43.      UpdateWindow (hwnd) ;
  44.  
  45.      while (GetMessage (&msg, NULL, 0, 0))
  46.           {
  47.           TranslateMessage (&msg) ;
  48.           DispatchMessage (&msg) ;
  49.           }
  50.      return msg.wParam ;
  51.      }
  52.  
  53. void DrawRect (HDC hdc, RECT *prc, COLORREF cr, WORD wType)
  54.      {
  55.      HBRUSH hBrush ;
  56.  
  57.      if (wType == IDM_PURE)
  58.           cr = GetNearestColor (hdc, cr) ;
  59.  
  60.      hBrush = CreateSolidBrush (cr) ;
  61.  
  62.      FillRect (hdc, prc, hBrush) ;
  63.      DeleteObject (hBrush) ;
  64.      }
  65.  
  66. void DrawColorCube (HDC hdc, short cxClient, short cyClient, WORD wType)
  67.      {
  68.      COLORREF cr ;
  69.      LONG     x, y ;
  70.      RECT     rc ;
  71.  
  72.           // UL: Black, UR: Blue, LL: Green, LR: Cyan
  73.  
  74.      for (y = 0 ; y <= 16 ; y++)
  75.           for (x = 0 ; x <= 16 ; x++)
  76.                {
  77.                rc.left   = (short) ( x      * cxClient / 68) ;
  78.                rc.top    = (short) ( y      * cyClient / 51) ;
  79.                rc.right  = (short) ((x + 1) * cxClient / 68) ;
  80.                rc.bottom = (short) ((y + 1) * cyClient / 51) ;
  81.  
  82.                cr = RGB (0, min (255, 16 * y), min (255, 16 * x)) ;
  83.  
  84.                DrawRect (hdc, &rc, cr, wType) ;
  85.                }
  86.  
  87.           // UL: Green, UR: Cyan, LL: Yellow, LR: White
  88.  
  89.      for (y = 0 ; y <= 16 ; y++)
  90.           for (x = 0 ; x <= 16 ; x++)
  91.                {
  92.                rc.left   = (short) ( x       * cxClient / 68) ;
  93.                rc.top    = (short) ((y + 17) * cyClient / 51) ;
  94.                rc.right  = (short) ((x +  1) * cxClient / 68) ;
  95.                rc.bottom = (short) ((y + 18) * cyClient / 51) ;
  96.  
  97.                cr = RGB (min (255, 16 * y), 255, min (255, 16 * x)) ;
  98.  
  99.                DrawRect (hdc, &rc, cr, wType) ;
  100.                }
  101.  
  102.           // UL: Yellow, UR: White, LL: Red, LR: Magenta
  103.  
  104.      for (y = 0 ; y <= 16 ; y++)
  105.           for (x = 0 ; x <= 16 ; x++)
  106.                {
  107.                rc.left   = (short) ( x       * cxClient / 68) ;
  108.                rc.top    = (short) ((y + 34) * cyClient / 51) ;
  109.                rc.right  = (short) ((x +  1) * cxClient / 68) ;
  110.                rc.bottom = (short) ((y + 35) * cyClient / 51) ;
  111.  
  112.                cr = RGB (255, max (0, 255 - 16 * y), min (255, 16 * x)) ;
  113.  
  114.                DrawRect (hdc, &rc, cr, wType) ;
  115.                }
  116.  
  117.           // UL: Cyan, UR: Blue, LL: White, LR: Magenta
  118.  
  119.      for (y = 0 ; y <= 16 ; y++)
  120.           for (x = 0 ; x <= 16 ; x++)
  121.                {
  122.                rc.left   = (short) ((x + 17) * cxClient / 68) ;
  123.                rc.top    = (short) ((y + 17) * cyClient / 51) ;
  124.                rc.right  = (short) ((x + 18) * cxClient / 68) ;
  125.                rc.bottom = (short) ((y + 18) * cyClient / 51) ;
  126.  
  127.                cr = RGB (min (255, 16 * y), max (0, 255 - 16 * x), 255) ;
  128.  
  129.                DrawRect (hdc, &rc, cr, wType) ;
  130.                }
  131.  
  132.           // UL: Blue, UR: Black, LL: Magenta, LR: Red
  133.  
  134.      for (y = 0 ; y <= 16 ; y++)
  135.           for (x = 0 ; x <= 16 ; x++)
  136.                {
  137.                rc.left   = (short) ((x + 34) * cxClient / 68) ;
  138.                rc.top    = (short) ((y + 17) * cyClient / 51) ;
  139.                rc.right  = (short) ((x + 35) * cxClient / 68) ;
  140.                rc.bottom = (short) ((y + 18) * cyClient / 51) ;
  141.  
  142.                cr = RGB (min (255, 16 * y), 0, max (0, 255 - 16 * x)) ;
  143.  
  144.                DrawRect (hdc, &rc, cr, wType) ;
  145.                }
  146.  
  147.           // UL: Black, UR: Green, LL: Red, LR: Yellow
  148.  
  149.      for (y = 0 ; y <= 16 ; y++)
  150.           for (x = 0 ; x <= 16 ; x++)
  151.                {
  152.                rc.left   = (short) ((x + 51) * cxClient / 68) ;
  153.                rc.top    = (short) ((y + 17) * cyClient / 51) ;
  154.                rc.right  = (short) ((x + 52) * cxClient / 68) ;
  155.                rc.bottom = (short) ((y + 18) * cyClient / 51) ;
  156.  
  157.                cr = RGB (min (255, 16 * y), min (255, 16 * x), 0) ;
  158.  
  159.                DrawRect (hdc, &rc, cr, wType) ;
  160.                }
  161.  
  162.           // UL: Yellow, UR: White, LL: Blue, LR: Black
  163.  
  164.      for (y = 0 ; y <= 16 ; y++)
  165.           for (x = 0 ; x <= 16 ; x++)
  166.                {
  167.                rc.left   = (short) ((x + 34) * cxClient / 68) ;
  168.                rc.top    = (short) ( y       * cyClient / 51) ;
  169.                rc.right  = (short) ((x + 35) * cxClient / 68) ;
  170.                rc.bottom = (short) ((y +  1) * cyClient / 51) ;
  171.  
  172.                cr = RGB (max (0, 255 - 16 * y), max (0, 255 - 16 * y),
  173.                          min (255, 16 * x + 16 * y - 2 * x * y)) ;
  174.  
  175.                DrawRect (hdc, &rc, cr, wType) ;
  176.                }
  177.  
  178.           // UL: Magenta, UR: Red, LL: Green, LR: Cyan
  179.  
  180.      for (y = 0 ; y <= 16 ; y++)
  181.           for (x = 0 ; x <= 16 ; x++)
  182.                {
  183.                rc.left   = (short) ((x + 34) * cxClient / 68) ;
  184.                rc.top    = (short) ((y + 34) * cyClient / 51) ;
  185.                rc.right  = (short) ((x + 35) * cxClient / 68) ;
  186.                rc.bottom = (short) ((y + 35) * cyClient / 51) ;
  187.  
  188.                cr = RGB (max (0, 255 - 16 * y), min (255, 16 * y),
  189.                          max (0, 255 - 16 * x - 16 * y + 2 * x * y)) ;
  190.  
  191.                DrawRect (hdc, &rc, cr, wType) ;
  192.                }
  193.      }
  194.  
  195. long FAR PASCAL WndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
  196.      {
  197.      static short cxClient, cyClient ;
  198.      static WORD  wType = IDM_DITHERED ;
  199.      HDC          hdc ;
  200.      HMENU        hMenu ;
  201.      PAINTSTRUCT  ps ;
  202.  
  203.      switch (message)
  204.           {
  205.           case WM_COMMAND:
  206.                hMenu = GetMenu (hwnd) ;
  207.  
  208.                switch (wParam)
  209.                     {
  210.                     case IDM_PURE:
  211.                     case IDM_DITHERED:
  212.                          CheckMenuItem (hMenu, wType, MF_UNCHECKED) ;
  213.                          wType = wParam ;
  214.                          CheckMenuItem (hMenu, wType, MF_CHECKED) ;
  215.  
  216.                          InvalidateRect (hwnd, NULL, TRUE) ;
  217.                          return 0 ;
  218.                     }
  219.  
  220.                break ;
  221.  
  222.           case WM_SIZE:
  223.                cxClient = LOWORD (lParam) ;
  224.                cyClient = HIWORD (lParam) ;
  225.                return 0 ;
  226.  
  227.           case WM_PAINT:
  228.                hdc = BeginPaint (hwnd, &ps) ;
  229.  
  230.                DrawColorCube (hdc, cxClient, cyClient, wType) ;
  231.  
  232.                EndPaint (hwnd, &ps) ;
  233.                return 0 ;
  234.  
  235.           case WM_DESTROY :
  236.                PostQuitMessage (0) ;
  237.                return 0 ;
  238.           }
  239.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  240.      }
  241.